package estrategia;

import java.io.IOException;
import java.util.ArrayList;

import javax.vecmath.Point3d;

import comunicacion.Conector;

public class Predictor {
	private static final int CANT_OBJETOS_BORRAR_ESTO = 10;
//	private int cantidadAliados;
//	private int cantidadOponentes;
//	private int cantidadFuertes;
	private int miRobot;
	private Historial[] historialesOponentes;
	private PredictorDaemon daemon;
	
	public Predictor(Conector entorno, int miRobot) {
		this.miRobot = miRobot;
		
		historialesOponentes = new Historial[CANT_OBJETOS_BORRAR_ESTO];
		for (int i=0; i<historialesOponentes.length; i++) {
			historialesOponentes[i] = new Historial(entorno);
		}
				
		// Inicialmente los historiales no aparecen vacios,
		// sino llenos con la posicion actual de cada uno
		for (int i=0; i<5; i++) {
			try {
				actualizarHistoriales(entorno.getCoordenadasObjetos());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		daemon = new PredictorDaemon(entorno, this);
		daemon.start();
	}
	
	public void actualizarHistoriales(Point3d[] nuevasCoordenadas) {
		for (int i=0; i<historialesOponentes.length; i++) {
			if (i < nuevasCoordenadas.length) {
				historialesOponentes[i].agregar(nuevasCoordenadas[i]);
			}
		}
	}
	
	public Point3d predecirPosicion(int idObjeto, int pasos) {
		int indice = idObjeto;
		if (indice == miRobot) {
			System.err.println("Estas prediciendo la posicion de tu bicho, no se si esta bueno eso");
		}
		if (indice > miRobot) {
			indice--;
		}
		
		if (historialesOponentes[indice] == null) {
			System.err.println("Accediendo a historial " + indice + ", que no existe");
		}
		
		Historial historial = historialesOponentes[indice];
		double rotacionPromedio = historial.getRotacionPromedio();
		double velocidadPromedio = historial.getVelocidadPromedio();
		Point3d posicionActual = historial.getUltimaPosicion();
		
		Point3d posicionFutura = new Point3d();
		posicionFutura.x = posicionActual.x + pasos*velocidadPromedio*Math.cos(rotacionPromedio);
		posicionFutura.y = posicionActual.y + pasos*velocidadPromedio*Math.sin(rotacionPromedio);
		posicionFutura.z = rotacionPromedio;
		
		System.out.println("Prediccion para " + idObjeto + " en " + pasos + " pasos: " + 
							posicionFutura.x + ", " + posicionFutura.y + ", " + posicionFutura.z);
		
		return posicionFutura;
	}
}
